package com.erp.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.erp.dto.CountResult;
import com.erp.mapper.UserMapper;
import com.erp.mapper.UserRoleMapper;
import com.erp.pojo.User;
import com.erp.pojo.UserRole;
import com.erp.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author Teacher
 * @description 针对表【t_user】的数据库操作Service实现
 * @createDate 2025-05-19 14:34:11
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User>
    implements UserService{

    @Autowired
    private UserMapper userMapper;
    @Autowired
    private UserRoleMapper userRoleMapper;
    @Override
    public Map<String, Object> queryUserListService(Integer pageNum, Integer pageSize) {
        Map<String, Object> result=new HashMap<>();
        //指定分页参数
        Page<User> page=new Page<>(pageNum,pageSize);
        List<User> userList = userMapper.selectList(page, null);

        result.put("total",page.getTotal());
        result.put("userList",userList);
        return result;
    }
    @Transactional()
    @Override
    public void saveUserRolerService(User user) {

        System.out.println("1----"+user.getId());
        //保存用户基本信息后需要获得数据库自增产生的用户id
        //userMapper.insert(user);
        userMapper.saveUserMapper(user);
        //获得数据库自增产生的id
        System.out.println("2----"+user.getId());

        Integer uid=user.getId();
        //获得当前用户分配的角色id的集合,从前台提交
        Integer[] rids = user.getRids();
        for(Integer rid : rids) {
            //保存用户和角色的关系
            UserRole ur = new UserRole();
            ur.setUid(uid); //用户id赋值
            ur.setRid(rid); //角色id赋值
            userRoleMapper.insert(ur);
        }


    }

    @Transactional( rollbackFor = Exception.class, propagation = Propagation.REQUIRED, isolation = Isolation.REPEATABLE_READ)
    @Override
    public void updateUserRoleService(User user) {


        //删除当前更新用户和角色的所有关系，断开关系
        QueryWrapper<UserRole> del=new QueryWrapper<>();
        del.eq("uid",user.getId());  //where uid=?
        userRoleMapper.delete(del);

        //更新用户信息
        userMapper.updateById(user);

        //中间关系表重新添加数据
        Integer[] rids = user.getRids();
        for(Integer rid:rids){
            UserRole ur=new UserRole();
            ur.setUid(user.getId());
            ur.setRid(rid);
            userRoleMapper.insert(ur);
        }
    }

//这是一个Spring提供的注解，用于声明事务管理。被此注解标注的方法在执行时，Spring会创建一个事务。如果在方法执行过程中抛出异常，事务会回滚，否则提交事务。
//这意味着如果在删除用户及其角色信息的过程中发生任何错误，所有已执行的操作都将被撤销，以保持数据的一致性。
    @Transactional
    @Override
    public void deleteUserRoleService(Integer id) {
        //删除用户
        userMapper.deleteById(id);
//创建了一个 QueryWrapper 对象，用于构建查询条件。UserRole 是一个实体类，代表用户角色信息。
//wrapper.eq("uid", id);
//使用 QueryWrapper 对象添加一个查询条件，指定 uid 字段等于方法参数 id。这里的 uid 很可能是用户角色信息表中的用户ID字段。
        QueryWrapper<UserRole> wrapper=new QueryWrapper<>();
        wrapper.eq("uid",id);
        //删除用户角色信息
        userRoleMapper.delete(wrapper);
    }


    @Override
    public List<CountResult> countEmployeeAageService() {
        return userMapper.countEmployeeAageMapper();
    }
    @Override
    public List<CountResult> countEmployeeEduService() {
        return userMapper.countEmployeeEduMapper();
    }

}




